#include <bits/stdc++.h>

using namespace std;

const int maxn=12;
const int maxs=1<<12;
const int inf=0x3f3f3f3f;

struct Triple{
    int x,y,s;
    Triple(const int &_x=0,const int &_y=0,const int &_s=0):x(_x),y(_y),s(_s){}
    inline const bool operator !() const{return x==0&&y==0&&s==0;}
};
struct Q{
    const static int size=maxn*maxn;
    int qx[maxn*maxn],qy[maxn*maxn];
    bool inq[maxn][maxn];
    int f,r;
    Q():f(0),r(0){}
    inline const bool hasElement() const {return f!=r;}
    inline void push(const int &x,const int &y){
        if(!inq[x][y]){
            qx[r]=x;qy[r++]=y;
            if(r>=size) r%=size;
            inq[x][y]=1;
        }
    }
    inline void pop(int &x,int &y){
        x=qx[f];y=qy[f];
        inq[x][y]=0;f++;
        if(f>=size) f%=size;
    }
};

Q q;
int n,m;
int g[maxn][maxn];
int f[maxn][maxn][maxs];
Triple from[maxn][maxn][maxs];
bool mark[maxn][maxn];

template <typename T> inline bool update(T &x,T y){if(x>y) return x=y,true;return false;}
inline void spfa(const int &s){
    const static int dx[4]={-1,0,1,0};
    const static int dy[4]={0,-1,0,1};
    while(q.hasElement()){
        int x,y;
        q.pop(x,y);
        for(int d=0;d<4;d++){
            int nx,ny;
            nx=x+dx[d];ny=y+dy[d];
            if(nx<1||ny<1||nx>n||ny>m) continue;
            if(update(f[nx][ny][s],f[x][y][s]+g[nx][ny])) from[nx][ny][s]=Triple(x,y,s),q.push(nx,ny);
        }
    }
}

inline void steiner(const int &cnt){
    for(int s=1,_end_=1<<cnt;s<_end_;s++){
        for(int x=1;x<=n;x++)
            for(int y=1;y<=m;y++)
                for(int k=s&(s-1);k;k=s&(k-1))
                    if(update(f[x][y][s],f[x][y][k]+f[x][y][s-k]-g[x][y]))
                        from[x][y][s]=Triple(x,y,k);
        for(int x=1;x<=n;x++) for(int y=1;y<=m;y++) if(f[x][y][s]!=inf) q.push(x,y);
        spfa(s);
    }
}

void markPath(const int &x,const int &y,const int &s){
    mark[x][y]=1;
    Triple fr;
    if(!(fr=from[x][y][s])) return;
    markPath(fr.x,fr.y,fr.s);
    if(fr.x==x&&fr.y==y) markPath(fr.x,fr.y,s-fr.s);
}

template <typename T> inline void read(T &r){
    char c;bool _f=0;
    for(c=getchar();c>'9'||c<'0';c=getchar()) if(c=='-') _f=1;
    for(r=0;c<='9'&&c>='0';c=getchar()) r=r*10+c-'0';
    if(_f) r=-r;
}

int main(){
    int cnt,x,y;

    memset(f,0x3f,sizeof f);
    read(n);read(m);
    cnt=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            read(g[i][j]);
            if(!g[i][j]) f[i][j][1<<(cnt++)]=0;
        }
    steiner(cnt);
    x=y=0;
    for(int i=1;i<=n&&(!x);i++)
        for(int j=1;j<=m;j++)
            if(!g[i][j]){
                x=i;y=j;
                break;
            }
    printf("%d\n",f[x][y][(1<<cnt)-1]);
    markPath(x,y,(1<<cnt)-1);
    for(int i=1;i<=n;i++,putchar('\n'))
        for(int j=1;j<=m;j++)
            if(!g[i][j])
                putchar('x');
            else if(mark[i][j])
                putchar('o');
            else putchar('_');

    return 0;
}
